from sqlite3.dbapi2 import connect
from flask import Flask,url_for,flash,render_template,redirect,request
import sqlite3


app = Flask(__name__)
#在涉及到通过url进行数据上下传时，需要通过本语句进行加密
app.config['SECRET_KEY']="this is my key for my website"

def get_db_conn():
    # 获得数据库连接
    conn=sqlite3.connect("database.db")
    # 通过本语句使得每一行数据都可以当字典用
    conn.row_factory=sqlite3.Row
    return conn
#通过id获取文章内容
def get_post(post_id):
    conn=get_db_conn()
    #调用sql语句进行查询，通过问号进行通配，第二个参数以元组的形式进行填充
    #当元组只有一个项的时候也要加逗号
    post=conn.execute("select * from posts where id = ?",(post_id,)).fetchone()
    return post
@app.route("/") #此装饰器表示为一个视图函数分配一个路由
def index():
    conn=get_db_conn()
    # 通过字典的方式将数据全部读取出来
    # order by created desc根据创建时间倒序显示
    posts=conn.execute('SELECT * FROM posts order by created desc').fetchall()
    conn.close()
    print(posts)
    #通过posts将数据传给index
    return render_template("index.html",posts=posts)
@app.route("/posts/new",methods=("POST","GET")) #新建文章页面，支持post和get方法以提交表单
def new():
    if request.method=='POST':
        title=request.form['title']
        content=request.form['content']
        #判断title是否存在
        if not title:
            #flash:对用户进行提醒
            flash('标题不能为空')
        elif not content:
            flash('内容不能为空')
        else:
            conn=get_db_conn()
            conn.execute('insert into posts (title,content) values (?,?)',(title,content))
            #当对数据库进行修改时，需要进行提交
            conn.commit()
            conn.close()
            flash('文章发布成功！')
            return redirect(url_for('index'))
    return render_template("new.html")

#文章详情页，通过post_id进行id获取
@app.route("/posts/<int:post_id>")
def post(post_id):
    post=get_post(post_id)
    print(post)
    return render_template("post.html",post=post)
#删除文章
@app.route("/posts/<post_id>/delete",methods=("POST",))
def delete(post_id):
    post=get_post(post_id)
    conn=get_db_conn()
    conn.execute("delete from posts where id = ?",(post_id,))
    conn.commit()
    conn.close()
    flash("{}删除成功".format(post['title']))
    return redirect(url_for('index'))
#编辑文章
@app.route("/posts/<post_id>/edit",methods=('GET','POST'))
def edit(post_id):
    #判断报文类型
    if request.method=='POST':
        title=request.form['title']
        content=request.form['content']
        #判断title是否存在
        if not title:
            #flash:对用户进行提醒
            flash('标题不能为空')
        elif not content:
            flash('内容不能为空')
        else:
            conn=get_db_conn()
            #通过update语句对内容进行修改
            conn.execute('update posts set title=?,content=? where id=?',(title,content,post_id))
            #当对数据库进行修改时，需要进行提交
            conn.commit()
            conn.close()
            flash('文章修改成功！')
            return redirect(url_for('index'))
    post=get_post(post_id)
    return render_template("edit.html",post=post)
#关于界面
@app.route("/about")
def about():
    return render_template("about.html")